﻿using System.Text;

namespace FileStreamTest
{

    class Program
    {
        static void Main(string[] args)
        {
            Test.Do();
        }
    }

    class Test
    {
        public static void Do()
        {
            // FileStream : File 文件；stream 流; 文件流
            using (FileStream fs = new FileStream("D:/Study/3.txt", FileMode.Open))
            {
                byte[] buffer = new byte[4096];
                // count ：返回真实的读取的长度
                // 经过 Read 方法，我们拿到了 byte 数据
                var count = fs.Read(buffer, 0, buffer.Length);
                // byte 数据转 string 
                // Encoding : encode 编码 decode 解码 ， default 默认
                string str = Encoding.Default.GetString(buffer, 0, count);
                Console.WriteLine(str);
                // 关闭流
                 fs.Close();
                // 释放所有被 Stream 使用到的资源
                //fs.Dispose(); // 使用 using 这一句就省掉了
            }

            // resource : 资源
            // 使用 using 则不需要开发中自己主动调用 dispose，它会无感知的在使用完毕之后自动释放
            // using : 使用 ； Filemode :文件打开模式； FileAccess : 文件访问权限 
            using (var fss = new FileStream("D:/Study/3.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                string msg = "\n你真的很不错！";
                var bts = Encoding.UTF8.GetBytes(msg);
                var ls = fss.Length;
                // position : 位置 ；这里指的是文件流的位置 ,当把文件流的位置指向最后写入数据就不会覆盖前面的信息
                fss.Position = ls;
                fss.Write(bts, 0, bts.Length);
            }

            using (var ffs = new FileStream("D:/Study/3.txt", FileMode.Open, FileAccess.Read))
            {
                string path = "D:/Study/Folder1/555.txt";
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
                using var ffss = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                var buffer = new byte[4];
                int count_outside = 0;
                while (ffs.Position < ffs.Length)
                {
                    count_outside++;
                    Console.WriteLine($"before: Position = {ffs.Position} , Lenght = {ffs.Length}");
                    // FileStream.Read 会导致 FileStream.Position 的位置发生偏移
                    var count = ffs.Read(buffer);
                    Console.WriteLine($"after : Position = {ffs.Position} , Lenght = {ffs.Length}");
                    Console.WriteLine($"我读了 ： {count}  数据！这是第 {count_outside} 次搬运");
                    // 相较于 3.txt ，因为 555.txt 是全新的，所以 不需要对 position 进行初次的偏移
                    ffss.Write(buffer, 0,  count);

                }
            }

        }
    }


}